package io.gitee.cengxiaoxiao.tools;

import cn.idev.excel.support.ExcelTypeEnum;
import cn.idev.excel.util.StringUtils;
import com.alibaba.fastjson2.JSONObject;
import io.gitee.cengxiaoxiao.annotations.DictConvert;
import io.gitee.cengxiaoxiao.converters.ConverterFactory;

import java.io.File;
import java.lang.reflect.Field;

/**
 * 对fastExcel的封装
 */
public class ExcelUtil {

    public static void isExcel(String fileName) {
        String format = fileName.substring(fileName.lastIndexOf("."));
        if (!ExcelTypeEnum.CSV.getValue().equalsIgnoreCase(format) &&
                !ExcelTypeEnum.XLS.getValue().equalsIgnoreCase(format) &&
                !ExcelTypeEnum.XLSX.getValue().equalsIgnoreCase(format)) {
            throw new IllegalArgumentException("文件格式只能为csv,xls,xlsx");
        }
    }

    public static File getExcelFile(String filepath) {
        if (StringUtils.isEmpty(filepath)) {
            throw new IllegalArgumentException("路径不能为空");
        }
        File file = new File(filepath);
        if (!file.exists() || !file.isFile()) {
            throw new IllegalArgumentException("文件不存在或是文件夹");
        }
        isExcel(file.getName());
        return file;
    }

    public static void checkFile(File file) {
        if (file == null) {
            throw new IllegalArgumentException("文件不能为空");
        }
        if (!file.exists() || !file.isFile()) {
            throw new IllegalArgumentException("文件不存在或类型为文件夹");
        }
    }


    /**
     * 拷贝对象属性到目标对象，返回一个新的目标对象
     * 在过程中进行字典转换
     *
     * @param source      源对象
     * @param targetClass 目标对象类
     * @param <T>         目标对象类型
     * @return 目标对象
     */
    public static <T> T copy(Object source, Class<T> targetClass) {
        Class<?> sourceClass = source.getClass();
        JSONObject jsonObject = new JSONObject();
        Field[] fields = sourceClass.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            try {
                // 检查是否有属性需要进行字典转换的
                if (field.isAnnotationPresent(DictConvert.class)) {
                    DictConvert dictConvert = field.getAnnotation(DictConvert.class);
                    Object newValue = ConverterFactory.convert(field.get(source), dictConvert);
                    jsonObject.put(field.getName(), newValue);
                } else {
                    jsonObject.put(field.getName(), field.get(source));
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace(System.err);
            }
        }
        return jsonObject.toJavaObject(targetClass);
    }

    public static <S> S dictConvert(S source) {
        Class<?> sourceClass = source.getClass();
        Field[] fields = sourceClass.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            try {
                // 检查是否有属性需要进行字典转换的
                if (field.isAnnotationPresent(DictConvert.class)) {
                    DictConvert dictConvert = field.getAnnotation(DictConvert.class);
                    Object newValue = ConverterFactory.convert(field.get(source), dictConvert);
                    field.set(source, newValue);
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace(System.err);
            }
        }
        return source;
    }

}
